import request from "@/utils/request";

/**
 * 处理 JSON-RPC 响应，提取数据或抛出错误
 * @param {Object} response Axios 响应对象
 * @returns {Object} 成功响应的 result 部分
 * @throws {Error} 如果响应包含错误
 */
function handleResponse(response) {
  if (response?.data?.error) {
    console.error("GB28181 API Error:", response.data.error);
    throw new Error(response.data.error.message || 'GB28181 API 请求失败');
  }
  // 直接返回 result 部分，让调用方处理具体内容
  if ('result' in response?.data) {
    return response.data.result;
  }
  // 未知错误或非预期格式
  console.error("Unexpected GB28181 API response format:", response?.data);
  throw new Error('GB28181 API 响应格式错误或非预期结果');
}

/**
 * 获取 GB28181 配置
 * @returns {Promise<Array>} GB28181配置数组，每个元素是一个SIP服务器配置
 * @returns {boolean} result[].enabled 是否启用此SIP服务器
 * @returns {string} result[].device_id 设备ID
 * @returns {Array} result[].channels 通道信息
 */
export async function getGB28181Config() {
  try {
    const response = await request.post('/v1/jsonrpc2', {
      id: `gb28181-get-config-${Date.now()}`,
      method: 'gb28181.getConfig',
      params: {}
    });
    const result = handleResponse(response);
    return {
      enabled: typeof result?.enabled === 'boolean' ? result.enabled : true,
      sip_server: Array.isArray(result?.sip_server) ? result.sip_server : []
    };
  } catch (error) {
    console.error("获取GB28181配置失败:", error);
    throw error instanceof Error ? error : new Error('获取GB28181配置失败');
  }
}

/**
 * 设置 GB28181 配置
 * @param {Array} config GB28181配置数组，每个元素是一个SIP服务器配置
 * @param {boolean} config[].enabled 是否启用此SIP服务器
 * @param {string} config[].device_id 设备ID（20位编码）
 * @param {string} config[].server_id 服务器ID（20位编码）
 * @param {string} config[].server_ip 服务器IP地址
 * @param {number} config[].server_port 服务器端口
 * @param {string} config[].password 认证密码
 * @param {string} config[].domain 域名（8位编码）
 * @param {string} config[].civil_code 行政区划代码（6位编码）
 * @param {number} config[].channel_count 通道数量
 * @param {Array} config[].channels 通道配置数组
 * @returns {Promise<Object>} 配置结果
 */
export async function setGB28181Config(config) {
  try {
    const payload = {
      enabled: typeof config?.enabled === 'boolean' ? config.enabled : true,
      sip_server: Array.isArray(config?.sip_server) ? config.sip_server : []
    };
    const response = await request.post('/v1/jsonrpc2', {
      id: `gb28181-set-config-${Date.now()}`,
      method: 'gb28181.setConfig',
      params: payload
    });
    return handleResponse(response);
  } catch (error) {
    console.error("设置GB28181配置失败:", error);
    throw error instanceof Error ? error : new Error('设置GB28181配置失败');
  }
}

/**
 * 验证设备ID格式（20位编码）
 * @param {string} deviceId 设备ID
 * @returns {boolean} 是否符合格式要求
 */
export function validateDeviceId(deviceId) {
  // 设备ID应为20位数字
  const deviceIdRegex = /^\d{20}$/;
  return deviceIdRegex.test(deviceId);
}

/**
 * 验证服务器ID格式（20位编码）
 * @param {string} serverId 服务器ID
 * @returns {boolean} 是否符合格式要求
 */
export function validateServerId(serverId) {
  // 服务器ID应为20位数字
  const serverIdRegex = /^\d{20}$/;
  return serverIdRegex.test(serverId);
}

/**
 * 验证行政区划代码格式（6位编码）
 * @param {string} civilCode 行政区划代码
 * @returns {boolean} 是否符合格式要求
 */
export function validateCivilCode(civilCode) {
  // 行政区划代码应为6位数字
  const civilCodeRegex = /^\d{6}$/;
  return civilCodeRegex.test(civilCode);
}

/**
 * 验证域名格式（10位编码）
 * @param {string} domain 域名
 * @returns {boolean} 是否符合格式要求
 */
export function validateDomain(domain) {
  // 域名应为10位数字
  const domainRegex = /^\d{10}$/;
  return domainRegex.test(domain);
}

/**
 * 验证通道ID格式（20位编码）
 * @param {string} channelId 通道ID
 * @returns {boolean} 是否符合格式要求
 */
export function validateChannelId(channelId) {
  // 通道ID应为20位数字
  const channelIdRegex = /^\d{20}$/;
  return channelIdRegex.test(channelId);
}

/**
 * 验证IP地址格式
 * @param {string} ip IP地址
 * @returns {boolean} 是否为有效IP地址
 */
export function validateIP(ip) {
  const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
  return ipRegex.test(ip);
}

/**
 * 验证端口号格式
 * @param {number|string} port 端口号
 * @returns {boolean} 是否为有效端口号
 */
export function validatePort(port) {
  const portNum = parseInt(port);
  return portNum >= 1 && portNum <= 65535;
} 
